package com.zeng.config;

import com.zeng.bean.Color;
import com.zeng.bean.ColorFactoryBean;
import com.zeng.bean.Person;
import com.zeng.bean.Red;
import com.zeng.conditional.LinuxConditional;
import com.zeng.conditional.MyImportBeanDefinitionRegistrar;
import com.zeng.conditional.MyImportSelector;
import com.zeng.conditional.WindowsConditional;
import org.springframework.context.annotation.*;

/**
 * @author Zqm
 * @Title: MyConfig2
 * @ProjectName SpringAnnotationDriven
 * @date 2019/1/10
 */
@Conditional(WindowsConditional.class)
@Configuration
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {

    /**
     * 默认是单例的
     *
     * @return scope  取值
     * prototype  多实例   懒加载  获取的时候才创建对象  每次获取都会调一遍
     * singleton  单实例   创建applicationContext容器启动创建对象
     * request session
     */
//    @Scope(value = "prototype")
    @Lazy  //懒加载
    @Bean
    public Person person() {
        System.out.println("给容器中添加bean");
        return new Person("张三", 200,"小张三");
    }

    /**
     * @Conditional{{Conditional数组}} 按照条件 注册bean
     * windows 就注册bill
     * linux 就注册linux
     */
    @Conditional(WindowsConditional.class)
    @Bean("bill")
    public Person person01() {
        return new Person("haha1", 123,"xiaohaha1");
    }


    @Conditional(LinuxConditional.class)
    @Bean("linux")
    public Person person02() {
        return new Person("haha2", 123,"xiaohaha2");
    }

    /**
     * 容器中注入组件
     *1.  包扫描+组件注解(@controller @service @Component @repository )  要是没加注解无法扫描
     *
     * 2.@Bean  导入第三方包
     *
     * 3.@Import{Bean1.class,Bean2.class}  导入   快速给容器中导入组件
     *   @ImportSelector  选择器
     *   @ImportBeanDefinitionRegistrar  手动注册bean到容器中
     *
     * 4.使用spring 提供的factoryBean (工厂Bean)
     *   默认获取到的是工厂bean 通过getObject创建的对象
     *   获取工厂bean本身需要给id 前面加一个&标识
     */

    @Bean
    public ColorFactoryBean colorFactoryBean(){
        return new ColorFactoryBean();
    }

}